#include "DynamicArray.h"

Dynamic_Array* Init_Array() {
	// 申请内存
	Dynamic_Array* My_Array = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));
    if(NULL == My_Array) {
        perror("malloc: ");           // 打印当前函数错误信息
        return NULL;
    }

	// 初始化
	My_Array -> size     = 0;
	My_Array -> capacity = 20;         // 初始容量

	My_Array -> pAddr    = (int*)malloc(sizeof(int) * My_Array -> capacity);
    if(NULL == My_Array -> pAddr) {
        perror("malloc: ");
        return NULL;
    }

    memset(My_Array -> pAddr, 0, sizeof(int) * 20);        // 初始化原始内存空间

	return My_Array;
}

int PushBack_Array(Dynamic_Array* arr, int pos, int value) {
    if(NULL == arr) {
		return -1;
	}

    if(pos < 0 || pos > arr -> size) {
        return -2;
    }

	// 判断现有空间是否足够
	if(arr -> size == arr -> capacity) {	
		// 1. 申请一块更大的内存空间，一般而言新申请的空间是旧空间的 2 倍
		int* New_Space = (int*)malloc(sizeof(int) * arr -> capacity * 2);

		// 2. 将现有数据全部拷贝数据到新空间
		memcpy(New_Space, arr -> pAddr, arr -> capacity * sizeof(int));

		// 3. 释放旧空间
        if(arr -> pAddr != NULL) {
		    free(arr -> pAddr);
            arr -> pAddr = NULL;
        }

		// 4. 更新容量
		arr -> capacity = arr -> capacity * 2;
		arr -> pAddr    = New_Space;
	}

	// 执行插入操作
    // 1、移动元素
    for(int i = arr -> size - 1; i >= pos; i--) {
        arr -> pAddr[i + 1] = arr -> pAddr[i];
    }

    // 2、在 pos 的位置插入元素
	arr -> pAddr[pos] = value;
	arr -> size++;

    return 0;
}

int IsEmpty_Array(Dynamic_Array* arr) {
    if(NULL == arr) {
        return -1;
    }

    if(arr -> size) {
        return MYARRAY_TRUE;
    }

    return MYARRAY_FALSE;
}

int RemoveByPos_Array(Dynamic_Array* arr, int pos) {
    if(NULL == arr) {
		return -1;
	}
	
	// 判断位置是否合法
	if(pos < 0 || pos >= arr -> size) {
		return -2;
	}

	// 执行删除操作
	for(int i = pos; i < arr -> size -1; i++) {
		arr -> pAddr[i] = arr -> pAddr[i + 1];
	}

    // 更新数组大小
	arr -> size--;

    return 0;
}

int Find_Array(Dynamic_Array* arr, int value) {
	if(NULL == arr) {
		return -1;
	}

	int pos = 0;
    int index = -2;
	for(pos = 0; pos < arr -> size; pos++) {
		if(arr -> pAddr[pos] == value) {
			index = pos;
			break;
		}
	}

	return index;
}

int RemoveByValue_Array(Dynamic_Array* arr, int value) {
	if(NULL == arr) {
		return -1;
	}

	// 确定待删除元素的位置
	int pos = Find_Array(arr, value);

	// 执行删除操作
    if(pos >= 0)  {
	    RemoveByPos_Array(arr, pos);
    } else {
        return pos;
    }

    return 0;
}

int Print_Array(Dynamic_Array* arr) {
	if(NULL == arr) {
		return -1;
	}

	for(int i = 0; i < arr -> size; i++) {
        cout << arr -> pAddr[i] << " ";
	}

    cout << "\n";

    return 0;
}

int Capacity_Array(Dynamic_Array* arr) {
	if(NULL == arr) {
		return -1;
	}

	return arr -> capacity;
}

int Size_Array(Dynamic_Array* arr) {
	if(NULL == arr) {
		return -1;
	}

	return arr -> size;
}

int At_Array(Dynamic_Array* arr, int pos) {
    if(NULL == arr) {
        return -1;
    }
    
    if(pos < 0 || pos > arr -> size - 1) {
        return -2;
    }

	return arr -> pAddr[pos];
}


int Clear_Array(Dynamic_Array* arr) {
	if(NULL == arr) {
		return -1;
	}

    if(arr -> pAddr != NULL) {
        memset(arr -> pAddr, 0, sizeof(int) * arr -> capacity);
    }

	arr->size = 0;

    return 0;
}

int Destroy_Array(Dynamic_Array* arr) {
    if(arr == NULL) {
        return -1;
    }

    if(arr -> pAddr != NULL) {
        free(arr -> pAddr);
        arr -> pAddr = NULL;
    }

    if(arr != NULL) {
        free(arr);
        arr = NULL;
    }

    return 0;
}
